# 导入 Flask 框架和 Flask-SQLAlchemy 扩展
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

# 导入 Python 的类型注解工具
from typing import List
from typing import Optional
from datetime import datetime

# 导入 SQLAlchemy 的核心功能，用于定义数据库结构
from sqlalchemy import ForeignKey
from sqlalchemy import String

# 导入 SQLAlchemy ORM 相关功能
from sqlalchemy.orm import DeclarativeBase
from sqlalchemy.orm import Mapped
from sqlalchemy.orm import mapped_column
from sqlalchemy.orm import relationship


# 定义一个继承自 DeclarativeBase 的基类，用于创建映射类
class Base(DeclarativeBase):
    pass


# 初始化 Flask-SQLAlchemy 扩展，指定模型类的基类为自定义的 Base 类
db = SQLAlchemy(model_class=Base)


# 定义 User 模型，映射到 "user_account" 表
class Users(Base):
    __tablename__ = "user"
    # 定义 id 字段，作为主键
    id: Mapped[int] = mapped_column(primary_key=True)
    # 定义 name 字段，字符串类型，最大长度为 30
    username: Mapped[str] = mapped_column(String(30), unique=True)
    # 定义 password 字段，字符串类型，最大长度为 30
    password: Mapped[str] = mapped_column(String(30))

    # 定义 posts 字段，与 Posts 模型建立一对多关系
    # cascade="all, delete-orphan" 表示级联删除所有相关联的地址
    posts: Mapped[List["Posts"]] = relationship(back_populates="user", cascade="all, delete-orphan")

    # 定义对象的字符串表示方法
    def __repr__(self) -> str:
        return f"User(id={self.id!r})"


# 定义 Posts 模型，映射到 "post" 表
class Posts(Base):
    __tablename__ = "post"
    # 定义 id 字段，作为主键
    id: Mapped[int] = mapped_column(primary_key=True)
    # 定义 user_id 字段，作为外键，关联到 user_account 表的 id 字段
    author_id: Mapped[int] = mapped_column(ForeignKey("user.id"))
    # 定义 created 字段
    created: Mapped[datetime] = mapped_column(db.TIMESTAMP, nullable=False, server_default=db.text("CURRENT_TIMESTAMP"))

    # 定义 created 字段
    title: Mapped[str]
    # 定义 created 字段
    body: Mapped[str]

    # 定义 user 字段，与 User 模型建立一对一关系
    user: Mapped["Users"] = relationship(back_populates="posts")

    # 定义对象的字符串表示方法
    def __repr__(self) -> str:
        return f"Posts(id={self.id!r})"
